package com.qww.supplement.singleton.type1;

/**
 * 饿汉式单例模式
 * 饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用，以后不再改变，所以天生是线程安全的。
 *
 * 1. 构造器私有化。避免外部通过new关键字被实例化。在同一个虚拟机内，Hungry的唯一实例只能通过getInstance()创建。
 * （事实上，java的反射机制可以创建private修饰构造器的类，这样会使单例模式失效。）
 * 2. 开始一上来，就直接定义一个private static final Hungry的实例instance，然后通风new在定义处初始化。
 * 3. 通过公共静态方法向外部提供该对象的引用
 *
 * 存在的问题：
 * 因为一上来就创建好所有的对象。如果这些对象很消耗内存空间德华，就会出问题。
 */

public class Hungry {

    // 验证内存占用问题
    private static  Byte[] data1 = new Byte[1024 * 1024];
    private static  Byte[] data2 = new Byte[1024 * 1024];
    private static  Byte[] data3 = new Byte[1024 * 1024];
    private static  Byte[] data4 = new Byte[1024 * 1024];
    private static  Byte[] data5 = new Byte[1024 * 1024];
    private static  Byte[] data6 = new Byte[1024 * 1024];

    private Hungry() { }

    private static final Hungry instance = new Hungry();
    //静态工厂方法
    // 对外暴露一个public static 的方法，返回该实例独享的引用。
    public static Hungry getInstance() {
        return  instance;
    }
}